JSP表单提交乱码解决方案
问题原因分析
JSP表单提交出现乱码通常是由于字符编码设置不正确导致的,主要有以下几种情况:
- 页面编码与服务器接收编码不一致
- GET和POST请求处理方式不同
- 数据库连接未设置正确编码
完整解决方案
1. 设置JSP页面编码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
2. 设置HTML表单编码
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <form action="process.jsp" method="post" accept-charset="UTF-8">
3. 处理POST请求乱码
在接收参数的JSP页面或Servlet中添加:
<% request.setCharacterEncoding("UTF-8"); %>
4. 处理GET请求乱码
对于GET请求,需要在服务器配置中设置URI编码:
在Tomcat的server.xml中找到Connector标签,添加:
<Connector URIEncoding="UTF-8" ... />
5. 完整示例代码
表单页面(index.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>表单示例</title> </head> <body> <form action="process.jsp" method="post"> 用户名: <input type="text" name="username"><br> 留言: <textarea name="message"></textarea><br> <input type="submit" value="提交"> </form> </body> </html>
处理页面(process.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 设置请求编码 request.setCharacterEncoding("UTF-8"); // 获取参数 String username = request.getParameter("username"); String message = request.getParameter("message"); // 处理数据... %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>处理结果</title> </head> <body> <h2>提交结果</h2> <p>用户名: <%= username %></p> <p>留言: <%= message %></p> </body> </html>
6. 使用过滤器统一处理编码
创建编码过滤器(EncodingFilter.java):
package com.example.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class EncodingFilter implements Filter { private String encoding = "UTF-8"; public void init(FilterConfig config) throws ServletException { String encodingParam = config.getInitParameter("encoding"); if (encodingParam != null) { encoding = encodingParam; } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(encoding); response.setCharacterEncoding(encoding); chain.doFilter(request, response); } public void destroy() { // 清理资源 } }
在web.xml中配置过滤器:
<filter> <filter-name>encodingFilter</filter-name> <filter-class>com.example.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
注意事项
- 确保所有环节(页面、请求处理、数据库)都使用相同的编码(推荐UTF-8)
- GET和POST请求需要分别处理
- 如果使用数据库,确保连接字符串也设置了正确的编码
- 对于Tomcat 8及以上版本,默认URI编码已经是UTF-8
数据库连接编码设置示例
MySQL连接示例:
jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8